
package com.andbase.library.utils;

import android.content.Context;
import android.util.Log;

import java.util.Calendar;
import java.util.Locale;


/**
 * Copyright ymbok.com
 * Author 还如一梦中
 * Date 2016/6/14 17:54
 * Email 396196516@qq.com
 * Info 日志工具类
 */

public class AbLogUtil {

    /** debug开关. */
	public static boolean D = false;

	/** info开关. */
	public static boolean I = false;

	/** error开关. */
	public static boolean E = false;
	
	/** 起始执行时间. */
	public static long startLogTimeInMillis = 0;
	

	/**
	 * debug日志
	 * @param tag
	 * @param message
	 */
	public static void d(String tag,String message) {
		if(D) Log.d(tag, message);
	}
	
	/**
	 * debug日志
	 * @param context
	 * @param message
	 */
	public static void d(Context context,String message) {
		String tag = context.getClass().getSimpleName();
		d(tag, message);
	}

	/**
	 * debug日志
	 * @param clazz
	 * @param message
	 */
	public static void d(Class<?> clazz,String message) {
		String tag = clazz.getSimpleName();
		d(tag, message);
	}
	
	/**
	 * debug日志
	 * @param context
	 * @param format
	 * @param args
	 */
	public static void d(Context context,String format, Object... args) {
		String tag = context.getClass().getSimpleName();
        d(tag, buildMessage(format, args));
    }

	/**
	 * debug日志
	 * @param clazz
	 * @param format
	 * @param args
	 */
	public static void d(Class<?> clazz,String format, Object... args) {
		String tag = clazz.getSimpleName();
        d(tag, buildMessage(format, args));
    }

	/**
	 * info日志
	 * @param tag
	 * @param message
	 */
	public static void i(String tag,String message) {
		Log.i(tag, message);
	}
	
	/**
	 * info日志
	 * @param context
	 * @param message
	 */
	public static void i(Context context,String message) {
		String tag = context.getClass().getSimpleName();
		i(tag, message);
	}

	/**
	 * info日志
	 * @param clazz
	 * @param message
	 */
	public static void i(Class<?> clazz,String message) {
		String tag = clazz.getSimpleName();
		i(tag, message);
	}
	
	/**
	 * info日志
	 * @param context
	 * @param format
	 * @param args
	 */
	public static void i(Context context,String format, Object... args) {
		String tag = context.getClass().getSimpleName();
        i(tag, buildMessage(format, args));
    }

	/**
	 * info日志
	 * @param clazz
	 * @param format
	 * @param args
	 */
	public static void i(Class<?> clazz,String format, Object... args) {
		String tag = clazz.getSimpleName();
        i(tag, buildMessage(format, args));
    }


	
	/**
	 * error日志
	 * @param tag
	 * @param message
	 */
	public static void e(String tag,String message) {
		Log.e(tag, message);
	}
	
	/**
	 * error日志
	 * @param context
	 * @param message
	 */
	public static void e(Context context,String message) {
		String tag = context.getClass().getSimpleName();
		e(tag, message);
	}

	/**
	 * error日志
	 * @param clazz
	 * @param message
	 */
	public static void e(Class<?> clazz,String message) {
		String tag = clazz.getSimpleName();
		e(tag, message);
	}
	
	
	/**
	 * error日志
	 * @param context
	 * @param format
	 * @param args
	 */
	public static void e(Context context,String format, Object... args) {
		String tag = context.getClass().getSimpleName();
        e(tag, buildMessage(format, args));
    }

	/**
	 * error日志
	 * @param clazz
	 * @param format
	 * @param args
	 */
	public static void e(Class<?> clazz,String format, Object... args) {
		String tag = clazz.getSimpleName();
        e(tag, buildMessage(format, args));
    }

	/**
	 * 记录当前时间毫秒.
	 * 
	 */
	public static void prepareLog(String tag) {
		Calendar current = Calendar.getInstance();
		startLogTimeInMillis = current.getTimeInMillis();
		Log.i(tag,"日志计时开始："+startLogTimeInMillis);
	}
	
	/**
	 * 记录当前时间毫秒.
	 * 
	 */
	public static void prepareLog(Context context) {
		String tag = context.getClass().getSimpleName();
		prepareLog(tag);
	}
	
	/**
	 * 记录当前时间毫秒.
	 * 
	 */
	public static void prepareLog(Class<?> clazz) {
		String tag = clazz.getSimpleName();
		prepareLog(tag);
	}
	
	/**
	 * 打印这次的执行时间毫秒，需要首先调用prepareLog().
	 *
	 * @param tag 标记
	 * @param message 描述
	 * @param printTime 是否打印时间
	 */
	public static void i(String tag, String message,boolean printTime) {
		Calendar current = Calendar.getInstance();
		long endLogTimeInMillis = current.getTimeInMillis();
		Log.i(tag,message+":"+(endLogTimeInMillis-startLogTimeInMillis)+"ms");
	}
	
	
	/**
	 * 打印这次的执行时间毫秒，需要首先调用prepareLog().
	 *
	 * @param context 上下文
	 * @param message 描述
	 * @param printTime 是否打印时间
	 */
	public static void i(Context context,String message,boolean printTime) {
		String tag = context.getClass().getSimpleName();
	    i(tag,message,printTime);
	}
	
	/**
	 * 打印这次的执行时间毫秒，需要首先调用prepareLog().
	 *
	 * @param clazz 标记
	 * @param message 描述
	 * @param printTime 是否打印时间
	 */
	public static void i(Class<?> clazz,String message,boolean printTime) {
		String tag = clazz.getSimpleName();
		i(tag,message,printTime);
	}

	/**
	 * debug日志的开关
	 * @param d
	 */
	public static void debug(boolean d) {
		D  = d;
	}
	
	/**
	 * info日志的开关
	 * @param i
	 */
	public static void info(boolean i) {
		I  = i;
	}
	
	/**
	 * error日志的开关
	 * @param e
	 */
	public static void error(boolean e) {
		E  = e;
	}
	
	/**
	 * 设置日志的开关
	 * @param e
	 */
	public static void setVerbose(boolean d,boolean i,boolean e) {
		D  = d;
		I  = i;
		E  = e;
	}
	
	/**
	 * 打开所有日志，默认全打开
	 */
	public static void openAll() {
		D  = true;
		I  = true;
		E  = true;
	}
	
	/**
	 * 关闭所有日志
	 */
	public static void closeAll() {
		D  = false;
		I  = false;
		E  = false;
	}
	
	/**
	 * format日志
	 * @param format
	 * @param args
	 * @return
	 */
	private static String buildMessage(String format, Object... args) {
        String msg = (args == null) ? format : String.format(Locale.US, format, args);
        StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace();
        String caller = "<unknown>";
        for (int i = 2; i < trace.length; i++) {
            Class<?> clazz = trace[i].getClass();
            if (!clazz.equals(AbLogUtil.class)) {
                String callingClass = trace[i].getClassName();
                callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
                callingClass = callingClass.substring(callingClass.lastIndexOf('$') + 1);
                caller = callingClass + "." + trace[i].getMethodName();
                break;
            }
        }
        return String.format(Locale.US, "[%d] %s: %s",
                Thread.currentThread().getId(), caller, msg);
    }


}
